package CreationMode.Singleton;

import java.io.ObjectStreamException;

/**
 * <h3>23_Design_Patterns</h3>
 * <p>
 *     单例模式：懒汉式
 *     双重检测机制
 *     实现了延迟加载，但是因为在方法上添加了synchronized关键字，每次调用getInstance方法都会同步，所以对性能的影响比较大。
 * </p>
 *
 * @author gdw
 * @since 2025-07-21 10:43:19
 */
public class SingletonInstance3 {
    //声明此类型的变量，但没有实例化
    private static volatile SingletonInstance3 instance = null;
    //私有化所有的构造方法，防止直接通过new关键字实例化
    private SingletonInstance3() {}
    //对外提供一个获取实例的静态方法
    public static SingletonInstance3 getInstance(){
        if(instance == null){
            synchronized (SingletonInstance3.class){
                if(instance == null){
                    //1.分配内存空间 2.执行构造方法，实例化对象，3.把这个对象赋值给这个空间
                    //如果不加volatile会执行重排序1 3 2
                    instance = new SingletonInstance3();
                }
            }
        }
        return instance;
    }
    // 重写该方法，防止序列化和反序列化获取实例
    private Object readResolve() throws ObjectStreamException {
        return instance;
    }
}
